home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 05 - 1989 / 05.08 Aug 89 / POOPDraw Code ƒ / OBJT Line.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-06-12  |  5.5 KB  |  212 lines  |  [TEXT/KAHL]

  1.  
  2. /********************************************************************/
  3. /*                        SOURCE CODE FILE                            */
  4. /********************************************************************/
  5. /*
  6. *   >>>    File name:        6.2 LineObject.c    
  7. *
  8. *      >>>    Purpose:        Methods for Line Object
  9. *     >>>    Project:        PoopDraw    Version 1        
  10. *     >>>    Date:            2/20/89
  11. *      >>>    By:                Adam Treister
  12. *
  13. */
  14. /********************************************************************/
  15. /*    For Your Information            1802 Hillside Rd. SB CA 93101    */
  16. /********************************************************************/
  17.  
  18. #include "PoopDrawInc"
  19.  
  20. /***** Object Type Defs *********************************************/
  21.  
  22. typedef struct
  23. {
  24.     _StdObjectFields
  25.     DrawStateRec drawState;
  26.     Point    start,end;
  27.     
  28. }    LineObjectRec,*LineObjectPtr,**LineObjectHandle;
  29.  
  30.  
  31. /***** Public Functions *********************************************/
  32.  
  33. ObjectHandle NewLineObj(LPtr ParmP);
  34.  
  35. /***** Private Functions ********************************************/
  36.  
  37. private    ObjDispatch(ObjectHandle ObjectH,int Message,LPtr ParmP);
  38. private    void Frame(LineObjectHandle ObjectH);
  39. private    void Draw(LineObjectHandle ObjectH);
  40. private    void DrawHandles(LineObjectHandle ObjectH);
  41. private    void Move(LineObjectHandle ObjectH,LPtr ParmP);
  42. private    void Track(LineObjectHandle ObjectH,Point pt);
  43.  
  44. /********************************************************************/
  45.  
  46. /*------------------------------------------------------------------*/
  47.  
  48.  
  49. ObjDispatch(ObjectH,Message,ParmP)
  50. ObjectHandle ObjectH;
  51. int Message;
  52. LPtr ParmP;
  53.  
  54. {
  55.     switch(Message)
  56.     {
  57.     
  58.         case FRAME:            Frame(ObjectH);                    break;
  59.         case DRAW:            Draw(ObjectH);                    break;
  60.         case MOVE:            Move(ObjectH,ParmP);            break;
  61.         case TRACK:            Track(ObjectH,*(Point *)ParmP);    break;
  62.         default:            DrawObjectDispatch(ObjectH,Message,ParmP);
  63.     }
  64. }    
  65. /*------------------------------------------------------------------*/
  66.  
  67. ObjectHandle NewLineObj(ParmP)
  68. LPtr ParmP;
  69. {
  70.     LineObjectHandle obj;
  71.     Rect r;
  72.     
  73.     r = *(Rect *)ParmP;
  74.     if (!Width(r) AND !Height(r))    return(NULL);
  75.     obj = _GetHandleToRecord(LineObjectRec);
  76.     NullOutHandle(obj);
  77.     (*obj)->start = topLeft(r);
  78.     (*obj)->end = botRight(r);
  79.     SortRect(&r);
  80.     (*obj)->dispatch = ObjDispatch;
  81.     (*obj)->class = LINE;
  82.     Dispatch(obj,INIT,&r);
  83.     Dispatch(obj,INVAL,NULL);
  84.     return((ObjectHandle)obj);
  85. }
  86.  
  87. /*------------------------------------------------------------------*/
  88.  
  89. void Draw(ObjectH)
  90. LineObjectHandle ObjectH;
  91. {
  92.     if (BitTst(&(*ObjectH)->attributes,VisibleBit))
  93.     {
  94.         register DrawStateRec drawState;
  95.         drawState = (*ObjectH)->drawState;
  96.  
  97.         PenNormal();
  98.         PenPat(**(GetPattern(drawState.penPat)));
  99.         PenSize(drawState.penSize,drawState.penSize);
  100.         MoveTo((*ObjectH)->start.h,(*ObjectH)->start.v);
  101.         LineTo((*ObjectH)->end.h,(*ObjectH)->end.v);
  102.      
  103.         if (BitTst(&(*ObjectH)->attributes,SelectedBit))
  104.         {
  105.                 DrawHandles(ObjectH);
  106.         }
  107.     }
  108. }    
  109. /*------------------------------------------------------------------*/
  110.  
  111. void Frame(ObjectH)
  112. LineObjectHandle ObjectH;
  113. {
  114.     Rect r;
  115.     int cushion; 
  116.     
  117.     PenNormal();    PenSize(2,2);
  118.     r = (*ObjectH)->bounds;
  119.     cushion = ((*ObjectH)->start.h < (*ObjectH)->end.h) ? 2 : -2;
  120.     MoveTo((*ObjectH)->start.h-cushion,(*ObjectH)->start.v-2);
  121.     LineTo((*ObjectH)->end.h+cushion,(*ObjectH)->end.v-2);
  122.     Line(0,4);
  123.     LineTo((*ObjectH)->start.h-cushion,(*ObjectH)->start.v+2);
  124.     Line(0,-4);
  125. }    
  126. /*------------------------------------------------------------------*/
  127.  
  128.  
  129. void DrawHandles(ObjectH)
  130. register LineObjectHandle ObjectH;
  131.  
  132. {
  133.             Rect r,objRect;
  134.             PenState penSave;
  135.             
  136.      GetPenState(&penSave);
  137.      PenPat(black);    PenMode(patXor);
  138.  
  139.      SetRect(&r,(*ObjectH)->start.h-(HANDLEWIDTH/2),(*ObjectH)->start.v-(HANDLEWIDTH/2),
  140.                  (*ObjectH)->start.h+(HANDLEWIDTH/2),(*ObjectH)->start.v+(HANDLEWIDTH/2));
  141.     
  142.      PaintRect(&r);    
  143.      SetRect(&r,(*ObjectH)->end.h-(HANDLEWIDTH/2),(*ObjectH)->end.v-(HANDLEWIDTH/2),
  144.                  (*ObjectH)->end.h+(HANDLEWIDTH/2),(*ObjectH)->end.v+(HANDLEWIDTH/2));
  145.      PaintRect(&r);
  146.      SetPenState(&penSave);
  147. }
  148. /*------------------------------------------------------------------*/
  149. void Move(ObjectH,ParmP)
  150. register LineObjectHandle ObjectH;
  151. LPtr ParmP;
  152.  
  153. {
  154.     int dh,dv;
  155.     
  156.     if (*ParmP == 0x8000) return;
  157.     dv = HiWord(*ParmP);    dh =  LoWord(*ParmP);    
  158.     Dispatch(ObjectH,INVAL,NULL);
  159.     OffsetRect(&(*ObjectH)->bounds,dh,dv);
  160.     (*ObjectH)->start.h +=dh;     (*ObjectH)->start.v += dv;
  161.     (*ObjectH)->end.h +=dh;     (*ObjectH)->end.v += dv;
  162.     Dispatch(ObjectH,INVAL,NULL);
  163. }
  164.  
  165. /*------------------------------------------------------------------*/
  166.  
  167.  
  168. void Track(ObjectH,pt)
  169. LineObjectHandle    ObjectH;
  170. Point                pt;
  171.     
  172. {
  173.     
  174.     Rect start,end,r;
  175.     Boolean InStart;
  176.     Point curPos,lastPos;
  177.     
  178.      SetRect(&start,(*ObjectH)->start.h-(HANDLEWIDTH/2),(*ObjectH)->start.v-(HANDLEWIDTH/2),
  179.                  (*ObjectH)->start.h+(HANDLEWIDTH/2),(*ObjectH)->start.v+(HANDLEWIDTH/2));
  180.     
  181.      SetRect(&end,(*ObjectH)->end.h-(HANDLEWIDTH/2),(*ObjectH)->end.v-(HANDLEWIDTH/2),
  182.                  (*ObjectH)->end.h+(HANDLEWIDTH/2),(*ObjectH)->end.v+(HANDLEWIDTH/2));
  183.  
  184.     if (PtInRect(pt,&start))        InStart = TRUE;
  185.     else if (PtInRect(pt,&end))        InStart = FALSE;
  186.     else return;
  187.  
  188.      SetRect(&r,pt.h-3,pt.v-3,pt.h+3,pt.v+3);
  189.      EraseRect(&r);    InvalRect(&r);
  190.     DrawLine((*ObjectH)->start,(*ObjectH)->end);
  191.     PenMode(patXor);
  192.      
  193.      while (StillDown())
  194.     {
  195.         GetMouse(&curPos);
  196.         if ((curPos.h != lastPos.h) OR (curPos.v != lastPos.v))
  197.         {
  198.             
  199.             DrawLine((*ObjectH)->start,(*ObjectH)->end);
  200.             if (InStart) (*ObjectH)->start = curPos;
  201.             else         (*ObjectH)->end = curPos;
  202.             DrawLine((*ObjectH)->start,(*ObjectH)->end);
  203.             lastPos = curPos;
  204.  
  205.     }    }
  206.      SetRect(&(*ObjectH)->bounds,(*ObjectH)->start.h,(*ObjectH)->start.v,
  207.                 (*ObjectH)->end.h,(*ObjectH)->end.v);
  208.     SortRect(&(*ObjectH)->bounds);
  209.     Dispatch(ObjectH,INVAL,NULL);
  210.     PenNormal();
  211. }
  212.